package com.ms.biz.config;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import com.system.comm.utils.FrameStringUtil;
import com.system.ds.DynamicDataSource;
import com.system.springboot.SpringBootVfs;

/**
 * springboot集成mybatis的基本入口
 * 1）创建数据源(如果采用的是默认的tomcat-jdbc数据源，则不需要)
 * 2）创建SqlSessionFactory
 * 3）配置事务管理器，除非需要使用事务，否则不用配置
 * @author yuejing
 * @date 2019年7月29日 上午9:00:09
 */
@Configuration
@MapperScan(basePackages = {"com.base.server.*.dao"})
public class MyBatisConfig {

	/**
	 * 根据数据源创建SqlSessionFactory
	 * @param ds
	 * @return
	 * @throws Exception
	 */
	@Bean
	public SqlSessionFactory sqlSessionFactory(DynamicDataSource ds) throws Exception {
		//解决myBatis下 不能嵌套jar文件的问题
		VFS.addImplClass(SpringBootVfs.class);
		SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
		// 指定数据源(这个必须有，否则报错)
		fb.setDataSource(ds);
		Resource configLocation = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml");
		fb.setConfigLocation(configLocation);
		// 下边两句仅仅用于*.xml文件，如果整个持久层操作不需要使用到xml文件的话（只用注解就可以搞定），则不加
		String typeAliasesPackage = FrameStringUtil.getTypeAliasesPackages("com.base.server.*.pojo;", ";");
		fb.setTypeAliasesPackage(typeAliasesPackage);
		List<Resource> resources = new ArrayList<Resource>();
		resources.addAll(Arrays.asList(new PathMatchingResourcePatternResolver()
				.getResources("classpath*:com/base/server/*/dao/mysql/*.xml")));
		fb.setMapperLocations(resources.toArray(new Resource[resources.size()]));
		return fb.getObject();
	}
}
